home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / Editors / emacs / Emacs-1.14b1 / lisp / think-c / think-ref.el < prev    next >
Encoding:
Text File  |  1994-05-05  |  6.0 KB  |  170 lines  |  [TEXT/EMAC]

  1. ;;;
  2. ;;; Code to send Apple events to Think Reference
  3. ;;;
  4. ;;; This code can run alone without the rest of the Think C suite.
  5. ;;;
  6.  
  7. (defun tc:think-ref-lookup-page (s)
  8.   (let* (event
  9.          (reply (make-string sizeof-AppleEvent 0))
  10.          transactionID
  11.          (psn (make-string (c:sizeof 'ProcessSerialNumber) 0))
  12.          (result
  13.           (catch 'panic
  14.             (throw-err (GetCurrentProcess psn))
  15.             (throw-err (ae-create-apple-event "DanR" "DanR" "REF "
  16.                                               event transactionID))
  17.             (throw-err (AEPutParamPtr event keyDirectObject typeChar s (length s)))
  18.             (throw-err (AEPutParamPtr event keyProcessSerialNumber
  19.                                       typeProcessSerialNumber psn (length psn)))
  20.             (throw-err (tc:think-ref-send-event event reply))
  21.             (setq ae-history (cons (cons transactionID
  22.                                          (list (cons 'description "think-ref-page-lookup")
  23.                                                (cons 'handler 'tc:lookup-page-reply)
  24.                                                (cons 'key s)))
  25.                                    ae-history))
  26.             noErr)))
  27.     
  28.     (if event (AEDisposeDesc event))
  29.     result))
  30.  
  31. (defun tc:lookup-page-reply (event history)
  32.   (let* ((error-number-data (make-string 4 0))
  33.          (returnedType (make-string 4 0))
  34.          (actualSize (make-string 4 0))
  35.          (err (AEGetParamPtr event keyErrorNumber typeLongInteger returnedType
  36.                              error-number-data (length error-number-data) actualSize)))
  37.     (if (= err errAEDescNotFound)
  38.         noErr
  39.       (tc:think-ref-announce-error history error-number-data)
  40.       noErr)))
  41.  
  42. (defun tc:think-ref-announce-error (history error-number-data)
  43.   (announce-reply history)
  44.   (let* ((error-number (extract-internal error-number-data 0 'long))
  45.          (key (assoc 'key history))
  46.          (f (if key (concat "“" (cdr key) "”"))))
  47.     (cond
  48.      ((= error-number -1)
  49.       (insert-reply (concat "  THINK Reference could not find the keyword"
  50.                             (if key (concat " " f) "")
  51.                             " in any of its databases.\n")))
  52.      ((= error-number -2)
  53.       (insert-reply "  THINK Reference could not find its databases.\n"))
  54.      ((= error-number -4)
  55.       (insert-reply (concat "  THINK Reference didn't have a template "
  56.                             "or Inside Macintosh\n  page number for "
  57.                             "the keyword " (if key f "") ".\n")))
  58.      ((= error-number -5)
  59.       (insert-reply (concat "  THINK Reference didn't have a template for the "
  60.                             "keyword" (if key f "") ", but "
  61.                             "it did return\n  an Inside Macintosh page number\n")))
  62.      (t
  63.       (insert-reply "  Error " (error-string error-number) "\n")))))
  64.  
  65. (defun tc:think-ref-copy-template (s)
  66.   (let* (event
  67.          (reply (make-string sizeof-AppleEvent 0))
  68.          transactionID
  69.          (result
  70.           (catch 'panic
  71.             (throw-err (ae-create-apple-event "DanR" "DanR" "TMPL"
  72.                                               event transactionID))
  73.             (throw-err (AEPutParamPtr event keyDirectObject typeChar s (length s)))
  74.             (throw-err (tc:think-ref-send-event event reply))
  75.             (setq ae-history (cons (cons transactionID
  76.                                          (list (cons 'description "think-ref-copy-template")
  77.                                                (cons 'handler 'tc:copy-template-reply)
  78.                                                (cons 'key s)))
  79.                                    ae-history))
  80.             noErr)))
  81.     
  82.     (if event (AEDisposeDesc event))
  83.     result))
  84.  
  85. (defun tc:copy-template-reply (event history)
  86.   (let* ((error-number-data (make-string 4 0))
  87.          (returnedType (make-string 4 0))
  88.          (actualSize (make-string 4 0))
  89.          (err (AEGetParamPtr event keyErrorNumber typeLongInteger returnedType
  90.                              error-number-data (length error-number-data) actualSize)))
  91.     (if (= err errAEDescNotFound)
  92.         (let* ((result-type (make-string (c:sizeof 'long) 0))
  93.                (result-size (make-string (c:sizeof 'long) 0))
  94.                (err (AESizeOfParam event keyDirectObject result-type result-size)))
  95.           (if (not (zerop err))
  96.               err
  97.             (let* ((actual-size (extract-internal result-size 0 'long))
  98.                    (s (make-string actual-size 0))
  99.                    (err (AEGetParamPtr event keyDirectObject typeChar
  100.                                        result-type s actual-size result-size)))
  101.               (if (not (zerop err))
  102.                   err
  103.                 (save-excursion
  104.                   (let ((think-ref-buf (get-buffer-create "*THINK Ref*")))
  105.                     (set-buffer think-ref-buf)
  106.                     (erase-buffer)
  107.                     (insert s)
  108.                     (kill-region (point-min) (point-max))
  109.                     (kill-buffer think-ref-buf)))
  110.                 noErr))))
  111.       (tc:think-ref-announce-error history error-number-data)
  112.       noErr)))
  113.  
  114. (defun tc:think-ref-send-event (event reply)
  115.   (let ((err (tc:think-ref-send-event-internal event reply)))
  116.     (if (= err connectionInvalid)
  117.         (if (y-or-n-p "Think Reference is not running.  Try to launch? ")
  118.             (let ((launch-err (launch-application "THINK Reference")))
  119.               (if (= launch-err fnfErr)
  120.                   (progn
  121.                     (message (concat "Put an alias to THINK Reference named “THINK "
  122.                                      "Reference” in the etc folder of Emacs."))
  123.                     noErr)
  124.                 (sleep-for 5) ;;; Let the Finder do the launch before resending
  125.                 (let ((err (tc:think-ref-send-event-internal event reply)))
  126.                   (if (= err connectionInvalid)
  127.                       (progn
  128.                         (message "Couldn't launch THINK Reference")
  129.                         noErr)
  130.                     err))))
  131.           noErr)
  132.       err)))
  133.  
  134. (defun tc:think-ref-send-event-internal (event reply)
  135.   (AESend event reply (+ kAEQueueReply kAECanInteract) kAENormalPriority 0 0 0))
  136.  
  137. (defun tc:do-think-ref-lookup-page (menu item)
  138.   (if (not (mark))
  139.       (message "The word to lookup should appear between point and mark.")
  140.     (let ((err (tc:think-ref-lookup-page (buffer-substring (point) (mark)))))
  141.       (report-error-in-message-line err))))
  142.  
  143. (defun tc:do-think-ref-copy-template (menu item)
  144.   (let* ((s (call-interactively
  145.              (function (lambda (x) (interactive "sTemplate to find: ") x))))
  146.          (err (tc:think-ref-copy-template s)))
  147.     (report-error-in-message-line err)))
  148.  
  149. (defvar tc:installed-think-ref-menu nil)
  150.  
  151. (if (not tc:installed-think-ref-menu)
  152.     (progn
  153.       (defvar special-menu nil)
  154.       (defvar menu-install-hooks nil)
  155.       
  156.       (setq tc:think-ref-menu-install-hooks
  157.             (list
  158.              '(AppendMenu special-menu "(-" nil)
  159.              '(AppendMenu special-menu "Find In THINK Reference/-"
  160.                           'tc:do-think-ref-lookup-page)
  161.              '(AppendMenu special-menu "Place Template In Kill Ring..."
  162.                           'tc:do-think-ref-copy-template)))
  163.       
  164.       (if special-menu
  165.           (mapcar (function eval) tc:think-ref-menu-install-hooks)
  166.         (setq menu-install-hooks (append tc:think-ref-menu-install-hooks
  167.                                          menu-install-hooks)))
  168.  
  169.       (setq tc:installed-think-ref-menu t)))
  170.